#!/bin/bash

echo "🚀 GoX 语言服务器功能测试"
echo "================================"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 检查函数
check_command() {
    if command -v $1 &> /dev/null; then
        echo -e "${GREEN}✓${NC} $1 已安装"
        return 0
    else
        echo -e "${RED}✗${NC} $1 未找到"
        return 1
    fi
}

# 测试编译功能
test_compilation() {
    echo -e "\n${BLUE}📦 测试编译功能${NC}"
    
    # 创建测试文件
    cat > test_example.gox << 'EOF'
package main

import (
    "database/sql"
    "fmt"
)

func GetUser(db *sql.DB, userID int) error {
    query := sql {
        SELECT id, name, email 
        FROM users 
        WHERE id = #{userID}
        AND status = {
            if userID > 0 {
                return "active"
            }
            return "inactive"
        }
    }
    
    row := db.QueryRow(query.String(), query.Args()...)
    fmt.Println("查询执行:", query.String())
    return nil
}

func main() {
    fmt.Println("GoX 语言服务器测试")
}
EOF

    # 测试编译
    if command -v goxc &> /dev/null; then
        if goxc -i test_example.gox -o test_example.go; then
            echo -e "${GREEN}✓${NC} 编译成功"
            
            # 检查生成的文件
            if [ -f test_example.go ]; then
                echo -e "${GREEN}✓${NC} 生成的 Go 文件存在"
                
                # 检查 Go 语法
                if go fmt test_example.go > /dev/null 2>&1; then
                    echo -e "${GREEN}✓${NC} 生成的代码语法正确"
                else
                    echo -e "${RED}✗${NC} 生成的代码有语法错误"
                fi
            else
                echo -e "${RED}✗${NC} 生成的 Go 文件不存在"
            fi
        else
            echo -e "${RED}✗${NC} 编译失败"
        fi
    else
        echo -e "${YELLOW}⚠${NC} goxc 未安装，跳过编译测试"
    fi
}

# 测试语言服务器
test_language_server() {
    echo -e "\n${BLUE}🔧 测试语言服务器${NC}"
    
    if command -v gox-lsp &> /dev/null; then
        echo -e "${GREEN}✓${NC} gox-lsp 已安装"
        
        # 启动语言服务器测试（timeout 5秒）
        echo "测试语言服务器启动..."
        timeout 5s gox-lsp -debug -log /tmp/gox-lsp-test.log 2>&1 &
        LSP_PID=$!
        
        sleep 2
        
        if kill -0 $LSP_PID 2>/dev/null; then
            echo -e "${GREEN}✓${NC} 语言服务器启动成功"
            kill $LSP_PID 2>/dev/null
        else
            echo -e "${RED}✗${NC} 语言服务器启动失败"
        fi
        
        # 检查日志
        if [ -f /tmp/gox-lsp-test.log ]; then
            echo -e "${GREEN}✓${NC} 日志文件已创建"
        fi
    else
        echo -e "${YELLOW}⚠${NC} gox-lsp 未安装，跳过语言服务器测试"
    fi
}

# 测试 VSCode 扩展文件
test_vscode_extension() {
    echo -e "\n${BLUE}📝 测试 VSCode 扩展${NC}"
    
    if [ -f vscode-extension/package.json ]; then
        echo -e "${GREEN}✓${NC} package.json 存在"
        
        # 检查扩展配置
        if grep -q "gox" vscode-extension/package.json; then
            echo -e "${GREEN}✓${NC} 扩展配置正确"
        fi
        
        # 检查语法高亮文件
        if [ -f vscode-extension/syntaxes/gox.tmLanguage.json ]; then
            echo -e "${GREEN}✓${NC} 语法高亮文件存在"
        fi
        
        # 检查代码片段
        if [ -f vscode-extension/snippets/gox.json ]; then
            echo -e "${GREEN}✓${NC} 代码片段文件存在"
        fi
        
        # 检查扩展脚本
        if [ -f vscode-extension/extension.js ]; then
            echo -e "${GREEN}✓${NC} 扩展脚本存在"
            
            # 检查是否包含语言服务器集成
            if grep -q "LanguageClient" vscode-extension/extension.js; then
                echo -e "${GREEN}✓${NC} 语言服务器集成已配置"
            fi
        fi
    else
        echo -e "${RED}✗${NC} VSCode 扩展文件缺失"
    fi
}

# 检查项目结构
check_project_structure() {
    echo -e "\n${BLUE}📁 检查项目结构${NC}"
    
    local required_dirs=("pkg/parser" "pkg/generator" "pkg/lsp" "cmd/goxc" "cmd/gox-lsp" "vscode-extension" "examples" "docs")
    
    for dir in "${required_dirs[@]}"; do
        if [ -d "$dir" ]; then
            echo -e "${GREEN}✓${NC} $dir/ 存在"
        else
            echo -e "${RED}✗${NC} $dir/ 缺失"
        fi
    done
    
    # 检查关键文件
    local required_files=("go.mod" "Makefile" "README.md")
    
    for file in "${required_files[@]}"; do
        if [ -f "$file" ]; then
            echo -e "${GREEN}✓${NC} $file 存在"
        else
            echo -e "${RED}✗${NC} $file 缺失"
        fi
    done
}

# 生成使用指南
generate_usage_guide() {
    echo -e "\n${BLUE}📖 生成使用指南${NC}"
    
    cat > LANGUAGE_SERVER_SETUP.md << 'EOF'
# GoX 语言服务器快速设置指南

## 1. 构建和安装

```bash
# 构建所有工具
make build-all

# 安装到系统路径
make install-all
```

## 2. VSCode 配置

创建或更新 VSCode 设置 (`settings.json`):

```json
{
  "gox.enableLanguageServer": true,
  "gox.languageServerPath": "gox-lsp",
  "gox.enableDiagnostics": true,
  "gox.compileOnSave": false,
  "gox.outputDirectory": "./gen"
}
```

## 3. 安装 VSCode 扩展

```bash
# 打包扩展
cd vscode-extension
npm install
npm run compile

# 安装扩展
code --install-extension gox-language-support-0.2.0.vsix
```

## 4. 测试功能

1. 创建 `.gox` 文件
2. 使用 `Ctrl+Shift+G` 编译
3. 体验智能提示和语法高亮

## 故障排除

如果遇到问题，请检查：
- goxc 和 gox-lsp 是否在 PATH 中
- VSCode 设置是否正确
- 扩展是否正确安装

详细信息请查看: docs/language-server-guide.md
EOF

    echo -e "${GREEN}✓${NC} 使用指南已生成: LANGUAGE_SERVER_SETUP.md"
}

# 清理测试文件
cleanup() {
    echo -e "\n${BLUE}🧹 清理测试文件${NC}"
    rm -f test_example.gox test_example.go
    rm -f /tmp/gox-lsp-test.log
    echo -e "${GREEN}✓${NC} 清理完成"
}

# 主测试流程
main() {
    echo -e "${YELLOW}检查依赖工具...${NC}"
    check_command "go"
    check_command "make"
    
    check_project_structure
    test_compilation
    test_language_server
    test_vscode_extension
    generate_usage_guide
    cleanup
    
    echo -e "\n${GREEN}🎉 测试完成！${NC}"
    echo -e "📖 查看完整指南: ${BLUE}docs/language-server-guide.md${NC}"
    echo -e "🚀 快速开始: ${BLUE}LANGUAGE_SERVER_SETUP.md${NC}"
}

# 运行测试
main "$@" 